/*
 * @Author: 晟松
 * @Date: 2021-11-30 00:00:56
 * @LastEditors: 晟松
 * @LastEditTime: 2021-12-07 22:32:46
 * @FilePath: \mini-vue3d:\Code\node\koa2\volunteer-service\src\main\middleware\globalError.js
 * @Description: 全局error处理
 */
// src/main/middleware/globalError.js
import { CommonError, ParamError, LoginError } from "@main/common/CommonError";
import { ValidationError } from "sequelize/lib/errors";
import TokenExpiredError from "jsonwebtoken/lib/TokenExpiredError";
import JsonWebTokenError from "jsonwebtoken/lib/JsonWebTokenError";
import { info,error } from '@main/util/Log4jsUtil';

export default () => {
  return async (ctx, next) => {
    try {
      await next();
    } catch (err) {
      // 处理全局error，这里 Sequelize 校验抛出的异常是 Sequelize 自己提供的异常类
      if (err instanceof ValidationError) {
        ctx.body = new ParamError(err.errors[0].message);
      } else if (err.status === 401) {
        // console.log("jwt err:", err);
        if (err.originalError instanceof JsonWebTokenError) {
          console.log("JsonWebTokenError:", err);
        }
        // JWT 异常处理
        if (err.originalError instanceof TokenExpiredError) {
          ctx.body = new LoginError("认证已超时，请重新登录");
        } else {
          ctx.body = new LoginError("请先登录");
        }
      } else if (err instanceof CommonError) {
        ctx.body = err;
      } else {
        ctx.body = new CommonError();
      }
      // console.error("全局err捕获:", err);
      // 记录日志
      error(err)
    }
  };
};
